import org.apache.spark.{SparkConf, SparkContext}

object scalal4214 {
  def main(args: Array[String]): Unit = {
    // 创建Spark配置
    val conf = new SparkConf()
      .setAppName("RDDOperations")
      .setMaster("local[*]")
    // 创建SparkContext
    val sc = new SparkContext(conf)

    try {
      // 代码3 - 16 intersection方法示例
      // 创建RDD
      val c_rdd1 = sc.parallelize(List(('a', 1), ('a', 1), ('b', 1), ('c', 1)))
      val c_rdd2 = sc.parallelize(List(('a', 1), ('b', 1), ('d', 1)))
      // 使用intersection方法求出两个RDD的共同元素
      val intersectionResult = c_rdd1.intersection(c_rdd2).collect()
      println("intersection方法结果:")
      intersectionResult.foreach(println)

      // 代码3 - 17 subtract方法示例
      // 创建RDD
      val rdd1 = sc.parallelize(List(('a', 1), ('b', 1), ('c', 1)))
      val rdd2 = sc.parallelize(List(('d', 1), ('e', 1), ('c', 1)))
      // 通过subtract方法求rdd1和rdd2彼此的补集
      val rdd1SubtractRdd2Result = rdd1.subtract(rdd2).collect()
      val rdd2SubtractRdd1Result = rdd2.subtract(rdd1).collect()
      println("\nrdd1相对于rdd2的subtract方法结果:")
      rdd1SubtractRdd2Result.foreach(println)
      println("\nrdd2相对于rdd1的subtract方法结果:")
      rdd2SubtractRdd1Result.foreach(println)

      // 代码3 - 18 cartesian方法示例
      // 创建RDD
      val rdd01 = sc.makeRDD(List(1, 3, 5, 3))
      val rdd02 = sc.makeRDD(List(2, 4, 5, 1))
      // 通过cartesian方法求两个RDD的笛卡尔积
      val cartesianResult = rdd01.cartesian(rdd02).collect()
      println("\ncartesian方法结果:")
      cartesianResult.foreach(println)

    } catch {
      case e: Exception =>
        println(s"执行RDD操作时发生异常: ${e.getMessage}")
    } finally {
      // 关闭SparkContext
      sc.stop()
    }
  }
}